home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok20.lha
/
GraphicLib
/
GraphicLib_V1.0.DOK
< prev
next >
Wrap
Text File
|
1993-08-15
|
21KB
|
377 lines
---------------------------------------------------------------------------
| Hinweis: In dieser Datei wird die Version 1.0 erklärt, die nicht |
| als Programm auf dieser Diskette vorliegt ! |
| |
| Für die aktuelle Version sollte man die Datei GraphicLib_V1.2.txt |
| noch zusätzlich zu dieser lesen. Die Version 1.2.2 liegt als |
| Source- und Objekt-Code vor. |
| Datum: 30.04.1989 |
---------------------------------------------------------------------------
MODULA2 (M2AMIGA) GraphicLib V 1.0,25.Oktober 1988
--------------------------------------------------
(*---------------------------------------------------------------------------*)
(* *)
(* Copyright 1984 by Thomas E. Speer *)
(* All rights reserved (PLOT V 3.3) *)
(* Released to the Public Domain for Non-commercial use only *)
(*---------------------------------------------------------------------------*)
(* *)
(* Diese Software darf frei kopiert werden, solange dabei kein Gewinn er- *)
(* zielt wird und der obige Copyright-Hinweis noch vorliegt. *)
(* Anpassung an den AMIGA: Gary Struhlik, 14.10.1988, V 1.0 *)
(* System: AMIGA 500, Kickstart 1.2 und M2Amiga von A.+L. Meier Vogt AG *)
(* V 3.11d 05.05.88 *)
(*---------------------------------------------------------------------------*)
(* *)
(* Die meisten in dieser Grafik-Bibliothek enthaltenen Unterprogramme wurden *)
(* von Thomas E. Speer in der Public Domain Serie SIG/M 194 veröffentlicht. *)
(* Diese wurden in TURBO PASCAL unter dem Betriebssystem CP/M erstellt. *)
(* *)
(* Die Anpassung und Erweiterung dieser Bibliothek wurde von Gary Struhlik *)
(* vorgenommen. Die Prozeduren wurden mit Hilfe des Compilers M2Amiga von *)
(* A.+L. AG erstellt. Das ursprüngliche Programm war in erster *)
(* Linie für den Drucker gedacht,d.h. die Darstellung auf dem Bildschirm war *)
(* nicht vorgesehen. Die speziellen Fähigkeiten des AMIGA wurden aus *)
(* Kompatibilitätsgründen nicht ausgenutzt. Die Grafiken sollen auch hier *)
(* für den späteren Ausdruck erstellt werden. *)
(* *)
(* Die umgesetzte Version soll als Version 1.0 bezeichnet werden, da *)
(* keine Garantie übernommen werden kann, daß sich nicht irgendwo ein Fehler *)
(* eingeschlichen hat. *)
(* Die Hardcopy Funktion könnte später noch optimiert werden. Man muß etwas *)
(* Geduld haben, ehe sich der Drucker rührt. Die geringe Geschwindig- *)
(* keit liegt an der Prozedur ReadPixel des Betriebssytem in der Version 1.2 *)
(* *)
(*---------------------------------------------------------------------------*)
Kurze Beschreibung:
-------------------
Dieses Modul soll dazu dienen Funktionen ( auch Wertepaare in Feldern ) auf
dem Bildschirm darstellen zu können. Es wird dabei nur eine zweifarbige Dar-
stellung ausgenutzt. Es ist dann möglich diese auf einem epsonkompatiblen
9-Nadel Drucker auszudrucken. Die hier integrierte HardCopy-Prozedur arbei-
tet sehr langsam. Schuld an der geringen Geschwindigkeit ist die im Betriebs-
system enthaltene Prozedur "ReadPixel" in der Kickstart Version 1.2. Der Aus-
druck dauert ca. 3 1/2 Minuten ( ca. 1 Minute ehe ReadPixel fertig ist, und
Rest ist die reine Druckzeit). Die Qualität ist aber für einen 9-Nadel Druck-
er relativ gut. Der Ausdruck erfolgt so ähnlich wie der NLQ-Ausdruck, es wird
jede Zeile zweimal gedruckt ( um 1/216 Inch verschoben). In vertikaler Rich-
tung ergibt sich eine fast geschlossene Linie. Der Bildschirm wird auf dem
Papier fast verzerrungsfrei ausgedruckt ( ein wenig mit der vertikalen Ein-
stellung des Monitors 'rumspielen).
Die meisten Befehle ( werden später erklärt ) arbeiten nicht mit der Punkt-
auflösung der AMIGA Grafikmodi, sondern es werden Koordinaten in REAL Dar-
stellung benutzt. Dies wurde so aus dem Original übernommen. Der Vorteil der
REAL Koordinaten liegt darin, daß man die Funktionen rechner- und compiler-
unabhängig darstellen kann. Einige Prozeduren sorgen für die Anpassung von
der tatsächlichen Bildschirmauflösung an die REAL Koordinaten, z.B. gmove.
Es werden jetzt die Auflösungsarten kurz erklärt:
-------------------------------------------------
Bildschirm des AMIGA: Es werden 640x256 (PAL) Punkte zur Darstellung benutzt
(rechnerabhängig).
Ursprung: Linke obere Ecke bei x=0 und y=0
mit x=0..639 und y=0..255
REAL-Koordinatenkreuz: Die original Software war für den Ausdruck auf einem
Drucker gedacht. Der Autor Thomas E. Speer hatte ein
Quadrat mit den folgenden Koordinaten definiert:
Ursprung: Linke untere Ecke bei x=0.0000 und y=0.0000
------
mit x=0.0000 ... 1.0000 und
y=0.0000 ... 1.0000
Da der Bildschirm rechteckig ist und in der vertikalen
Richtung eine geringere Punktdichte hat, gibt es Ver-
zerrungen gegenüber dem Original.
0.0000,1.0000 1.0000,1.0000
----------------
| AMIGA |
| Bildschirm |
| |
----------------
0.0000,0.0000 1.0000,0.0000
Aus dieser Definition erkennt man, daß die Koordinaten be-
liebige reelle Werte zwischen 0.0000 und 1.0000 annehmen
dürfen.
Wichtig:
--------
Bei den REAL-Koordinaten muß man zwei Arten unterscheiden. Einmal die Bild-
schirmkoordinaten, die später die Größe des Koordinatenkreuzes auf dem Bild-
schirm festlegen und die REAL-Koordinaten der Wertepaare einer Funktion.
Die REAL-Bildschirm-Koordinaten haben nichts mit den AMIGA-Koordinaten des
640x256 Punkte Bildschirmes zu tun, d.h. sie werden transformiert.
Darstellung von Funktionen:
---------------------------
Die wichtigsten Funktionen sind graph und Graph ( kein Eingabefehler, einmal
mit großem G geschrieben). Wobei bei graph die Werte einzeln gezeichnet
werden und der (die) Programmierer(in) erst die Grafik mit GraphOn
einschalten muß ( siehe Beispiel ), so braucht er (sie) bei der Prozedur
Graph nur diese aufrufen. Hierbei wird eine vollständige Funktion (z.B. sin)
als Parameter übergeben. Diese Methode scheitert natürlich, wenn man z.B.
Meßwerte als Kurve darstellen möchte. Wer Lust hat, kann ja noch andere Var-
ianten von Graph entwickeln, z.B. Übergabe eines OPEN ARRAY oder die Be-
schriftung der Achsen.
Bei Aufruf einer dieser Prozeduren wird ein vollständiges Koordinatenkreuz
gezeichnet. Die Skalierung erfolgt automatisch, aber derzeit nur linear.
Wer logarithmisch darstellen möchte (z.B. Amplitude eines komplexen Frequenz-
gangs), übergibt einfach die Werte als 20*log10(ua/ue) für die y-Achse.
Hinweis:
--------
Bei dieser Grafik wird ein Fenster geöffnet, der (die) Programmierer(in)
braucht sich nicht mit dem Betriebssystem 'herumzuschlagen',dies erfolgt
automatisch sobald die Prozedur GraphOn aufgerufen wird. Alle Befehle
beziehen sich jetzt auf dieses Fenster. Das Fenster hat keinen Rahmen
und sieht im ersten Augenblick wie ein Screen aus. Es kann nach Aufruf
mit MouseClick intuitiv am Schließ-Gadget geschlossen werden ( alles ist
verloren), danach sollte noch GraphOff aufgerufen werden (sauberes
Schließen des Fensters). Das Fenster kann ebenfalls intuitiv in den
Hinter- bzw. Vordergrund geschaltet werden. Die Gadgets sind unsichtbar,
die Zeichenfläche wird aber dafür voll ausgeschöpft ( Wer klickt, der
findet). Falls man zwischendurch mit ReadString, WriteString oder so
etwas ein- bzw. ausgeben möchte, sollte man das Grafikfenster nach
'hinten' klicken. Falls man nicht Graph benutzt, sondern andere Befehle,
so sollte der Aufruf im eigenen Programm in etwa so aussehen:
GraphOn;
InitVector;
... Anweisungsfolge (z.B. graph) ....
MouseClick;
GraphOff
Falls man nur Graph benutzt, so sind keine weiteren Befehle
nötig ( HardCopy ist hier nicht möglich !)
Noch ein Hinweis zu der Textdarstellung:
In den Prozeduren gchar und gwrite wird ein eigener Zeichensatz defi-
niert. Warum ? Sicher die Zeichen sind nicht ganz perfekt in ihrer
Darstellung (z.B. ungleichmäßige Zahlen), aber der Vorteil liegt darin,
daß die Zeichen ihre Größe ändern können, sogar ihren Winkel !
Die Befehle:
------------
Prozedur | Kurze Beschreibung
------------------------------------------------------------------------------
PROCEDURE UnableToOpen( name : STRING ); hat nur interne Bedeutung
Der IMPORT wäre eigentlich
unsinnig
PROCEDURE ClrGraphic; Grafik löschen
PROCEDURE GraphOn; Die Grafik einschalten
(Bildschirm wird auto-
matisch gelöscht)
PROCEDURE BlackPen; Zeichenstift schwarz
(löschen)
PROCEDURE WhitePen; Zeichenstift weiß
PROCEDURE PlotPixel (x,y : INTEGER); Punkt zeichnen
(normaler AMIGA-Bild-
schirm PAL)
PROCEDURE ClearPixel (x,y : INTEGER); Punkt löschen
( AMIGA-Bildschirm PAL)
PROCEDURE HardCopy ( lm : CARDINAL); HardCopy
lm: linker Rand 0..26
-> 13 HardCopy in der
Mitte des Papiers
PROCEDURE DrawLine ( x1,y1,x2,y2 : INTEGER); Linie zeichnen
( AMIGA PAL )
PROCEDURE ClearLine ( x1,y1,x2,y2 : INTEGER); Linie löschen
( AMIGA PAL)
PROCEDURE PrintText ( x,y : INTEGER;
Zeichenkette : STRING ); Text in Grafik mit
Standardzeichensatz !
-------------------
(AMIGA PAL)
PROCEDURE MouseClick; Warten bis Mausklick an
Gadget
PROCEDURE GraphOff; Grafikfenster schließen
Grafik Ende
PROCEDURE InitCharSize; Den neu definierten
Zeichensatz initialisieren
********* Achtung Koordinaten in REAL !! **************
PROCEDURE gmove( x,y :REAL); Bewegt 'Malstift' absolut
nach x,y
PROCEDURE vector( x,y : REAL); Zieht eine Linie von der
aktuellen Stiftposition
zur Position x,y
(absolut)
PROCEDURE ChSet ( xsize,ysize, theta : REAL); Legt die Größe und den
Winkel des neu definierten
Zeichensatzes fest:
xsize: x-Größe
ysize: y-Größe
theta: Winkel (Grad !)
REAL-Bereich beachten !
PROCEDURE gchar( cx,cy : REAL; charin : CHAR); Ein Grafikzeichen zeichnen
(neu definiert)
cx,cy: Koordinaten links
unten vom Zeichen
charin: Das Zeichen
PROCEDURE gwrite(x,y : REAL; chars : textline); Wie gchar, aber für
Zeichenkette (max. 80
Zeichen)
PROCEDURE Print( x,y : INTEGER; satz : textline); Wie gwrite, aber die
Koordinaten sind jetzt
wieder auf den AMIGA
Bildschirm bezogen (PAL)
PROCEDURE rx( sxi : REAL ) : REAL; Umwandlung von
Bildschirmkoordinate =>
Realkoordinate
sxi: Bildschirmkoordinate
PROCEDURE ry( syi : REAL ) : REAL; Wie rx, aber für y-Achse
PROCEDURE sx( rxi : REAL ) : REAL; Gegenteil von rx
PROCEDURE sy( ryi : REAL ) : REAL; Gegenteil von ry
PROCEDURE swindo( sxlti,sxrti,
syboti,sytopi : REAL ); Bildschirmfenstergröße
festlegen ( ungleich
AMIGA Fenster ! )
sxlti: linke Ecke
sxrti: rechte Ecke
syboti: untere Ecke
sytopi: obere Ecke
PROCEDURE rwindo( xmini,xmaxi,ymini,ymaxi : REAL); Real-Fenster-Größe
xmini: linke Ecke
xmaxi: rechte Ecke
ymini: untere Ecke
ymaxi: obere Ecke
PROCEDURE segmnt (x1,y1,x2,y2 : REAL); Eine Linie von (x1,y1)
nach (x2,y2) ziehen
PROCEDURE InitVector; Initialisierung der
Vektorgrafik (stets
aufrufen !)
InitCharSize braucht
dann nicht benutzt
werden !
PROCEDURE point (x,y : REAL); Punkt setzen
x,y absolut
PROCEDURE posang (angle : REAL) : REAL; Winkel innerhalb 0..360
Grad, falls größer oder
kleiner
PROCEDURE ticend (rmin,rmax,dr : REAL; Berechnung der Größen
VAR pr1,pr2 : REAL); des Achsenendes.
PROCEDURE dxdy( x1,x2 : REAL; nx : INTEGER; Achsen formatieren.
VAR lblnum,lbldec : INTEGER) : REAL; (interne Bedeutung)
PROCEDURE axis( r1,r2,dri, Koordinatenkreuz zeich-
sx1,sy1,sx2,sy2,ticlen,ticang : REAL; nen.
lblnum,lbldec : INTEGER; lblang : REAL);
r1: Realwert (Achsenstart)
r2: Realwert (Achsenende)
dri: Realwertabstand der
Intervalle
sx1,sx2,sy1,sy2:
Bildschirmkoordinaten
des Achsenkreuzes
ticlen: Länge der Mar-
kierungsstriche
ticang: Winkel zur Horz.
(für ticlen)
lblnum: Anzahl der Zeichen
in der Zeichenkette
lbldec: Anzahl der Nach-
kommastellen
lblang: Winkel in Grad
PROCEDURE graph( xmini,xmaxi : REAL;
nx : INTEGER; ymini,ymaxi : REAL;
ny : INTEGER; sxl,sxr,syb,syt : REAL);
Graphen in Koordinaten-
kreuz zeichnen.
xmin,xmax: Realwerte
für x-Achse
nx: Intervalle auf der
x-Achse
ymin,ymax: Realwerte
für y-Achse
ny: Intervalle auf der
y-Achse
sxl,sxr,syb,syt:
Bildschirmkoordinaten
des Achsenkreuzes
( tatsächliche Größe )
auf dem Bildschirm
PROCEDURE Graph ( f : fkt ; Schritt : REAL;
xanf,xende : REAL; xAbschnitte : INTEGER; Wie graph, kann
yanf,yende : REAL; yAbschnitte : INTEGER; aber ganz alleine
xlanf, xlende, ylanf, ylende : REAL); aufgerufen werden
Übergabe einer
REAL-Funktion
fkt
Noch ein Tip:
-------------
Auf der PUBLIC DOMAIN Diskette 'FISH 58' befindet sich ein ähnliches
Programm (EGRAPH). Hier können die Wertepaare auch in logarithmisch
eingeteilten Achsen dargestellt werden. Ein Ausdruck ist ebenfalls
möglich. Allerdings kann man diese Software nicht in eigene Pro-
gramme einbinden. Die Wertepaare müssen in einer ASCII-Textdatei
angelegt werden, diese werden dann vom Programm eingelesen.
Viel Spaß !
-Gary-